﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Prototipo.control;
using SIGEB.Modelo.moduloUsuarios;

namespace SIGEB.Prototipo.Control
{
    public class controlGrupos
    {
        #region "constructores"

        public controlGrupos(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "validación"

        internal bool camposGrupoValidos(grupo nuevo)
        {
            return codValido(nuevo.codGrupo) && nombreValido(nuevo.nombre) && descripcionValida(nuevo.descripcion) && montoMultaValida(nuevo.multaDiaria.ToString()) &&
                tipoUsuarioValido(nuevo.tipoUsuarioCodigo);
        }

        internal bool codValido(string cod)
        {
            return Validacion.LongitudCadenaValida(cod, false, 60);
        }

        internal bool nombreValido(string nombre)
        {
            return Validacion.LongitudCadenaValida(nombre, true, 60);
        }

        internal bool descripcionValida(string descripcion)
        {
            return Validacion.LongitudCadenaValida(descripcion, false, 100);
        }

        internal bool montoMultaValida(string monto)
        {
            return Validacion.NumeroValido(monto, true, false);
        }

        internal bool tipoUsuarioValido(string tipoUsuario)
        {
            return Validacion.LongitudCadenaValida(tipoUsuario, true, 60);
        }

        internal bool camposModificarValidos(grupo nuevo)
        {
            return camposGrupoValidos(nuevo);
        }

        #endregion

        #region "métodos"

        internal void agregarGrupo(grupo nuevo)
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_AGREGAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!camposGrupoValidos(nuevo))
            {
                throw new Exception("Campos inválidos");
            }
            cp.datos.grupos.agregargrupo(nuevo);
        }

        internal void eliminarGrupo(string cod)
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_ELIMINAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!codValido(cod))
            {
                throw new Exception("Codigo del grupo invalido");
            }
            cp.datos.grupos.eliminargrupo(cod);
        }

        internal void modificar(string code, grupo nuevo)
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_MODIFICAR_TODOS))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!camposModificarValidos(nuevo) || !codValido(code))
            {
                throw new Exception("Campos de modificar inválidos");
            }
            cp.datos.grupos.modificargrupo(code, nuevo);
        }

        internal grupo getGrupo(string code)
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_CONSULTAR_TODOS))
            {
                return null;
            }

            if (!codValido(code))
            {
                throw new Exception("Código inválido");
            }
            return cp.datos.grupos.obtenergrupo(code);
        }

        internal LinkedList<grupo> getGrupos()
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_CONSULTAR_TODOS))
            {
                return null;
            }
            return cp.datos.grupos.obtenergrupos();
        }

        internal LinkedList<tipoUsuario> obtenerTiposUsuario()
        {
            if (!cp.usuarioActualPuede(acciones.GRUPOS_CONSULTAR_TODOS))
            {
                return null;
            }
            return cp.datos.tiposUsuario.obtenertipoUsuario();
        }

        #endregion  

        #region "atributos"

        controlPrincipal cp;
        
        #endregion
    }
}
